package main.core;

import java.util.ArrayList;
import java.util.Vector;

import main.activities.shootpoints;
import main.gameInfo.gameInfo;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;

public class Table {

	Bitmap sea;
	int offset = 10;
	int numQuadros = 10;
	int espacamento = 0;
	int posXInicial = 0;
	int posYInicial = 0;
	int matrixSize = 0;
	int posXShip = 0;
	int posYShip = 0;
	boolean[][] matrix = new boolean[numQuadros][numQuadros];
	public static ArrayList<shootpoints> acertosDoInimigo = new ArrayList<shootpoints>();
	public static ArrayList<shootpoints> errosDoInimigo = new ArrayList<shootpoints>();
	public static ArrayList<shootpoints> meusAcertos = new ArrayList<shootpoints>();
	public static ArrayList<shootpoints> meusErros = new ArrayList<shootpoints>();

	public Table() {

		matrixSize = gameInfo.SCREEN_HEIGHT - offset;

		espacamento = (matrixSize) / numQuadros;
		gameInfo.ESPACAMENTO = espacamento;
		posXInicial = (gameInfo.SCREEN_WIDTH - matrixSize) - offset;
		posYInicial = (gameInfo.SCREEN_HEIGHT - matrixSize) / 2;

	}

	protected void update(long diffTime) {

	}

	protected void onDraw(Canvas canvas) {
		Paint p = new Paint();
		p.setColor(Color.YELLOW);

		renderMatrix(canvas);

	}

	private void renderMatrix(Canvas canvas) {
		Paint p = new Paint();
		p.setColor(Color.WHITE);

		for (int i = 0; i <= numQuadros; i++) {
			for (int j = 0; j <= numQuadros; j++) {

				canvas.drawLine(posXInicial + i * espacamento, posYInicial,
						posXInicial + i * espacamento,
						matrixSize + posYInicial, p); // Verticais

				canvas.drawLine(posXInicial, posYInicial + j * espacamento,
						matrixSize + posXInicial,
						posYInicial + j * espacamento, p); // Horizontais
			}
		}
	}

	public boolean checkShotcolision(int x, int y) {
		System.out.println("merda1");
		for (int i = 0; i < numQuadros; i++) {
			System.out.println("merda2");
			for (int j = 0; j < numQuadros; j++) {

				int tableX = posXInicial + i * espacamento;
				int tableY = posYInicial + j * espacamento;
				
				System.out.println("merda3: "+tableX +" tabley "+tableY);
				
				if ((x+espacamento > tableX+1) && (x < posXInicial + (i + 1) * espacamento)) {

					System.out.println("merda4");

					if ((y+espacamento > tableY) && (y < posYInicial + (j + 1) * espacamento)) {

						System.out.println("merda5");

						if (hasShip(i, j)) {

							System.out.println("merda6");
							acertosDoInimigo.add(new shootpoints(tableX + 1,
									tableY + 1));
							System.out.println("table inimigo acertou");
							return true;
						} else {

							System.out.println("merda7");
							errosDoInimigo.add(new shootpoints(tableX + 1,
									tableY + 1));
							System.out.println("table inimigo errou");
							return false;
						}
					}
				}
			}
		}
		System.out.println("merda8");
		return false;
	}

	public int[] backToPosition(int x, int y) {
		return new int[] { posXInicial + x * espacamento,
				posYInicial + y * espacamento };

	}

	public int[] correctPosition(int x, int y) {
		for (int i = 0; i < numQuadros; i++) {
			for (int j = 0; j < numQuadros; j++) {

				int tableX = posXInicial + i * espacamento;
				int tableY = posYInicial + j * espacamento;

				if ((x+espacamento > tableX + 1) && (x < posXInicial + (i + 1) * espacamento - 1)) { 

					if ((y+espacamento > tableY + 1) && (y < posYInicial + (j + 1) * espacamento - 1)) {
						return new int[] { i, j };
					}
				}
			}
		}
		System.out.println("cagou vei");
		return new int[] { 0, 0 };
	}

	// Verifica se o click foi dentro da tabela
	public boolean isInsideTable(int x, int y) {

		if ((x > posXInicial && x < posXInicial + matrixSize)
				&& (y > posYInicial && y < posYInicial + matrixSize)) {
			// System.out.println("\n#### is inside Matrix ####");

			return true;
		} else
			return false;
	}

	// Seta o click em coordenada de tabela. E o slot torna-se true se posicao
	// do navio eh valida.
	public boolean setShipPosition(int x, int y, int qtdSlots) {

		for (int i = 0; i < numQuadros; i++) {
			for (int j = 0; j < numQuadros; j++) {

				int tableX = posXInicial + i * espacamento;
				int tableY = posYInicial + j * espacamento;

				if ((x > tableX + 1)
						&& (x < posXInicial + (i + 1) * espacamento - 1)) { // "+1"
																			// e
																			// "-1"
																			// para
																			// nao
																			// pegar
																			// as
																			// linhas
																			// da
																			// tabela.
					if ((y > tableY + 1)
							&& (y < posYInicial + (j + 1) * espacamento - 1)) {

						if (!hasShip(i, j) && canPutHere(i, j, qtdSlots)) { // Verifica
																			// se
																			// tem
																			// navio
																			// e
																			// se
																			// nao
																			// esta
																			// setando
																			// fora
																			// da
																			// tela.
							setSlotsTrue(i, j, qtdSlots); // Seta true na matrix
															// onde o navio
															// esta.
							posXShip = tableX;
							posYShip = tableY;

							// System.out.println("\n**** Inserted on table *****");
							// System.out.println("x: " + i);
							// System.out.println("y: " + j);
							//
							// System.out.println("Matrix");
							// for(int k = 0; k < numQuadros; k++){
							// for(int p = 0; p < numQuadros; p++){
							// System.out.println("i: " + k + " | j: " + p + " "
							// + matrix[k][p]);
							// }
							// }

							return true;
						}
					}
				}
			}
		}

		return false;
	}

	// **** Some Functions ****

	public boolean canPutHere(int x, int y, int qtdSlots) {

		if (y > 5 && qtdSlots == 5) { // Fora da tela
			System.out.println("cant");
			return false;
		}

		if (y > 6 && qtdSlots == 4) { // Fora da tela
			System.out.println("cant");
			return false;
		}

		if (y > 7 && qtdSlots == 3) { // Fora da tela
			System.out.println("cant");
			return false;
		}

		for (int j = 0; j < qtdSlots; j++) { // Verifica colisao com outros
												// navios
			if (matrix[x][j] == true) {
				return false;
			}
		}

		System.out.println("can PUT");
		return true;
	}

	public void setSlotsTrue(int i, int j, int qtdSlots) {

		for (int k = 0; k < qtdSlots; k++)
			// I = mesma linha e J = varia as Colunas para setar true..
			matrix[i][j + k] = true;
	}

	public boolean[][] getMatrix() {
		return matrix;
	}

	public boolean hasShip(int x, int y) {
		if (matrix[x][y] == true)
			return true;
		else
			return false;
	}

	public int getXShipTable() {
		return posXShip;
	}

	public int getYShipTable() {
		return posYShip;
	}

	public int getEspaco() {
		return espacamento;
	}

	public int getXInicial() {
		return posXInicial;
	}

	public int getYInicial() {
		return posYInicial;
	}

}
